//
// 通用队列管理
// Created by kenny on 25-10-30.
//

#ifndef MCP_QUEUE_H
#define MCP_QUEUE_H
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif

    // 队列结构体 （不透明指针）
    typedef struct mcp_queue_t mcp_queue_t;

    // mcp_queue.h 增加函数声明
    typedef void* (*element_copy_func)(void* dest, const void* src, size_t element_size);
    typedef void (*element_free_func)(void* element);

    // 创建队列时注册拷贝和释放函数
    // mcp_queue_t* mcp_queue_create(int capacity);
    // mcp_queue_t* mcp_queue_create(int capacity, size_t element_size);
    mcp_queue_t* mcp_queue_create(int capacity, size_t element_size,
                                       element_copy_func copy_func,
                                       element_free_func free_func);

    // 销毁队列
    void mcp_queue_destroy(mcp_queue_t* queue);
    // 向队列添加数据包
    // int mcp_queue_enqueue(mcp_queue_t* queue, const CustomPacket* packet);
    int mcp_queue_enqueue(mcp_queue_t* queue, const void* element);
    // 从队列取出数据包
    //int mcp_queue_dequeue(mcp_queue_t* queue, CustomPacket* packet);
    int mcp_queue_dequeue(mcp_queue_t* queue, void* element);
    // 获取队列当前大小
    int mcp_queue_size(const mcp_queue_t* queue);
    // 检查队列是否为空
    int mcp_queue_is_empty(const mcp_queue_t* queue);
    // 检查队列是否已满
    int mcp_queue_is_full(const mcp_queue_t* queue);
    // 清空队列（需要提供释放函数，可为NULL）
    void mcp_queue_clear(mcp_queue_t* queue);
    //void mcp_queue_clear(mcp_queue_t* queue, void (*free_func)(void*));
#ifdef __cplusplus
}
#endif
#endif //MCP_QUEUE_H
